Перейти к основному содержимому
Версия: 1.0

Общие настройки

Сервисы интеграции – это встроенные в sink компоненты, реализующие логику интеграции агента с внешними системами, передающие результаты работы sink во внешнюю систему. Все сервисы имеют базовую конфигурацию для подключения интегрируемого сервера по его адресу, порту и требуемому типу аутентификации (basic, bearer, token) с возможностью настройки протокола связи (http, https) и возможностью отключения проверки SSL-сертификата. Реализованы сервисы интеграции со следующими системами:

  1. Kaspersky Cybertrace;
  2. PT NAD;
  3. MISP;
  4. RuSIEM;
  5. UserGate.

Остальные интеграции реализованы через загрузку файла, сформированного агентом. Загрузка этого файла осуществляется средствами внешней системы или напрямую, без использования агентского приложения.

Чтобы использовать конкретную конфигурацию пайплайна вместо базовой, необходимо в файле docker-compose.yml заменить путь ./pkl/configs/base_pipeline.pkl на путь к нужному файлу, например, ./pkl/configs/cybertrace_pipeline.pkl.

Переменные окружения​

В общем случае необходимо определить следующие переменные окружения:
Основные переменные для подключения к Solar TI Feeds

  • TIC_AGENT_API_SERVER=api.data.rt-solar.ru - Адрес сервера Solar TI Feeds
  • TIC_AGENT_API_TOKEN - JWT-токен для аутентификации на сервере Solar TI Feeds
  • TIC_AGENT_NOTIFICATION_SERVER=notifications.data.rt-solar.ru - Адрес сервера уведомлений

Настройки локального хранилища и путей (опционально)

  • TIC_AGENT_SQLITE_DB_FILE=/data/agent/states.sqlite - Полный путь к файлу базы данных SQLite для хранения состояния работы агента
  • TIC_AGENT_OUTPUT_DIR=/data/agent/data - Директория для сохранения результирующих файлов (CSV, TXT)
  • TIC_AGENT_LOG_DIR=/data/agent/ - Директория для хранения лог-файлов работы агента

По умолчанию путь /data/agent/ монтируется в локальную папку ./work.

Конфигурации внешних сервисов​

Конфигурация ServiceConfig определяет параметры для взаимодействия с внешним сервисом. Обязательные для заполнения поля credentials и address поддерживают различные настройки:

  • credentials — принимает объект одной из трёх схем аутентификации: Basic, Bearer или Token.
  • address — содержит параметры сетевого подключения, подробно описанные в отдельной таблице ниже.

Параметры конфигурации ServiceConfig​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
credentialsCredentialsДаДанные для аутентификацииcredentials = new agent.Basic {username = cyberTraceUser password = cyberTracePassword}
addressAddressДаДанные подключенияaddress {host = cyberTraceHost port = cyberTracePort insecureSkipVerify = true scheme = "https"}
timeoutDuration30.sНетТаймаут запросов60.s
listNameStringДаИмя списка для загрузки данных“4rays_feeds”

Параметры конфигурации Basic​

ПараметрТип данныхОбязательностьОписание
usernameStringДаИмя пользователя
passwordStringДаПароль

Параметры конфигурации Bearer​

ПараметрТип данныхОбязательностьОписание
bearerTokenStringДаBearer токен без префикса Bearer

Параметры конфигурации Token​

ПараметрТип данныхОбязательностьОписание
tokenStringДаТокен доступа

Параметры конфигурации Address​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
hostStringДаАдрес внешнего сервераexample.com
portStringДаПорт внешнего сервера8080
schemeStringhttpsНетСхема подключения к серверу, возможные значения: http, httpshttp
insecureSkipVerifyBooleanfalseНетОтключение проверки SSL-сертификата сервераtrue

Пример базового конфигурационного файла​

В данном конфигурационном файле описан пайплайн по выгрузке отдельных потоков сетевых индикаторов по каждому из фидов, перечисленных в локальной переменной feedsList, в виде подписки на изменения с сохранением данных в CSV необходимого формата, который формируется в IndicatorsTextMap -> fielsdMap.
Для изменения списка выгружаемых фидов необходимо изменить состав значений в feedsList. Для выбора других типов индикаторов – FeedsStreamGenerator -> filter -> types, изменение других параметров запроса API находится в том же блоке filter.
Основные параметры конфигурации в виде адреса сервера, токена и локальных путей читаются из переменных окружения, и вынесены в отдельный блок описания локальных переменных для уменьшения дублирования значений в объявлении самого пайплайна.

amends "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/Pipelaner.pkl"
import "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/source/Components.pkl"
import "../agent.pkl"
import "../templates.pkl"

local feedsList = templates.allFeedsList.map((it) -> it.toLowerCase())

local outputDir = "/data/agent"
local ouptputFileName = "ioc.csv"

pipelines {
new Components.Pipeline {
name = "base_config"
inputs {
new agent.FeedStreamGenerator {
name = "indicators-generator"
server = templates.serverEnvCfg
schedule = templates.scheduleCronMinCfg
filter = new agent.IndicatorRequestParams {
types = List("ipv4-addr", "ipv6-addr", "domain-name", "url")
feedNames = feedsList
actions = List("create", "update", "delete")
fields = List("indicator_id", "value", "indicator_type", "valid_until", "first_seen", "action", "external_references", "categories", "last_seen", "relations", "description", "rules", "feeds", "zone")
iter {
limit = 1000
}
}
sqlite = templates.sqliteEnvCfg
}
}
transforms {
new agent.IndicatorsTextMap {
name = "indicators-map"
inputs {
"indicators-generator"
}
fieldsMap {
["FeedSource"] = """
"ti_cloud"
"""
["IndicatorID"] = "IndicatorID"
["IndicatorType"] = "IndicatorType"
["Action"] = "Action"
["UpdatedAt"] = "UpdatedAt"
["Value"] = "Value"
["Description"] = "Description"
["FirstSeen"] = "FirstSeen"
["LastSeen"] = "LastSeen"
["ValidUntil"] = "ValidUntil"
["Relations"] = """
len(Relations) > 0 ? Relations : ""
"""
["RelatedReports"] = """
let reports = map(Relations, {#.ObjectType == "report" ? #.ObjectValue : ""});
join(filter(reports, {# != ""}), ",")
"""
["RelatedThreatActors"] = """
let actors = map(Relations, {#.ObjectType == "threat-actor" ? #.ObjectValue : ""});
join(filter(actors, {# != ""}), ",")
"""
["RelatedMalware"] = """
let malware = map(Relations, {#.ObjectType == "malware" ? #.ObjectValue : ""});
join(filter(malware, {# != ""}), ",")
"""
["RelatedTools"] = """
let tools = map(Relations, {#.ObjectType == "tool" ? #.ObjectValue: ""});
join(filter(tools, {# != ""}), ",")
"""
["RelatedFiles"] = """
let files = map(Relations, let x = #; x.ObjectType == "file" ? x.ObjectValue : "");
join(filter(files, {# != ""}), ",")
"""
["RelatedIndicators"] = """
let indicators = map(Relations, let x = #; x.ObjectType == "indicator" ? x.IndicatorType +":" + x.ObjectValue : "");
join(filter(indicators, {# != ""}), ",")
"""
["ExternalReferences"] = "ExternalReferences"
["Rules"] = "Rules"
["Categories"] = "Categories"
["Feeds"] = "Feeds"
["Zone"] = "Zone"
}
}
}
sinks {
new agent.IndicatorsTextSink {
name = "indicators-sinks"
inputs {
"indicators-map"
}
writer {
outputDirectory = outputDir
outputFileName = ouptputFileName
writeMode = "rolling"
fileFormat = "csv"
writeHeaders = true
separator = ","
quote = "\""
allQuotes = true
}
sqlite = templates.sqliteEnvCfg
}
}
}
}

settings = templates.baseSettings